package com.ys.io.p2数据流读写基本数据类型;

import java.io.*;

/**
 * 描述: 数据流只有字节流没有字符流
 * 打印流打印各种不同类型的数据最终都是把数据转为了String 存入文件
 * 只有数据流 DataInput|OutputSteam 可以保证 写入与读取的数据一致性
 *
 * @author CodeYang
 * @version 2021/1/2 21:16
 */
public class 数据流的了解与使用 {


    /**
     * writeByte()、 写byte
     * writeShort()、写短整数
     * writeInt()、写int
     * writeLong()、..
     * writeFloat()、..
     * writeDouble()、..
     * writeChar()、写入字符
     * writeBoolean()、写入boolean
     * writeUTF()等方法。写入字符串
     * DataInputStream和DataOutputStream都是一个装饰流创建对象2必须有一个基础流作为参数
     *
     * @param args
     */

    public static void main(String[] args) {

        try {
            method01();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 场景：我定义一个Student数组，使用DataOutputStream将数组的数据写入磁盘，然后使用DataInputStream将数据读取出来并且打印
     * 步骤：1 定义Student类：id stuName stuScore stuSex smoking(是否吸烟）
     * 2 定义Student数组
     * 3 编写try with resources
     * 4 创建FileOutputStream对象用来写入数据
     * 5 创建DataOutputStream对象将FileOutputStream对象注入到它里面
     * 6 遍历Student数组，将Student对象的数据写入磁盘
     * 7 创建FileInputStream对象用来读取磁盘数据
     * 8 创建DataInputStream对象将FileOutputStream对象注入到它里面
     * 9 逐个读取磁盘文件里面的Student
     * 10 打印数据
     * -----
     * 持久化对象数组的数据到 文件
     */
    private static void method01() throws Exception {
        //定义并创建学生数组
        Student[] students = {
                new Student(101, "tm", 99.9, '男', false),
                new Student(102, "jn", 60.9, '男', true),
                new Student(303, "los", 99.9, '女', false)
        };

        try (       // 创建基础流来写和读
                    FileOutputStream fileOutputStream = new FileOutputStream("day_24/student");
                    // 创建数据流来写对象的基本类型数据
                    DataOutputStream dataOutputStream = new DataOutputStream(fileOutputStream);

                    // 使用数据来读取数据
                    DataInputStream dataInputStream = new DataInputStream(new FileInputStream("day_24/student"));

        ) {
            // 把对象数组的数据写到文件中 会以字节流方式的写入
            for (Student student : students) {
                dataOutputStream.writeInt(student.getId());
                dataOutputStream.writeUTF(student.getStuName());
                dataOutputStream.writeDouble(student.getStuScore());
                dataOutputStream.writeChar(student.getStuSex());
                dataOutputStream.writeBoolean(student.isSmoking());
            }
            dataOutputStream.flush();
            // 还原数据
            for (int i = 0; i < students.length; i++) {
                // 写入的顺序和读取的顺序必须保持一致
                int id = dataInputStream.readInt();
                String stuName = dataInputStream.readUTF();
                double stuScore = dataInputStream.readDouble();
                char stuSex = dataInputStream.readChar();
                // boolean不是布尔类型，而是Logic(逻辑)类型
                boolean smoking = dataInputStream.readBoolean();
                System.out.println(id+"-"+stuName+"-"+stuScore+"-"+stuSex+"-"+smoking);
            }

        }


    }
}
